package controllers;

import play.*;
import play.mvc.*;

import java.text.SimpleDateFormat;
import java.util.*;

import models.*;

@With(Secure.class)
/**
 * @author Benitez Guillaume
 * controlleur lié aux actions sur les fiches échelles
 */
public class FicheEchelles extends CRUD {

	/**
	 * Instancie des variables de session(session.put())
	 * Met ces variables dans des variables de rendu(render.args())
	 */
	@Before
	static void setConnectedUser() {
		if(Security.isConnected()) {
			if(!session.contains("agent_fullname")){
				Agent agent = Agent.find("nomUtilisateur", Security.connected()).first();
				Fonction gestFonct=Fonction.find("id_fonction like ?", "FONCT").first();
				Fonction gestTer=Fonction.find("id_fonction like ?", "TERRI").first();
				Fonction admin=Fonction.find("id_fonction like ?", "ADM").first();
				Fonction chef_CIS=Fonction.find("id_fonction like ?", "RCIS").first();
				Fonction formateur=Fonction.find("id_fonction like ?", "FOR").first();
				List<CIS> centres=CIS.find("responsable.id like ?", agent.id).fetch();
				boolean resp=!centres.isEmpty();
				/*
				 * Compte le nombre d'autorisation en attente pour les CIS où l'agent est responsable
				 * et l'ajoute à une variable de session et de rendu.
				 */
				List<Candidat> listeCandidats=new ArrayList<Candidat>();
				if(agent.fonction.contains(chef_CIS) || resp){
					Iterator<CIS> i=centres.iterator();
					while(i.hasNext()){
						List<Candidat> cand=Candidat.find("agent.cis.id like ? and etatCandid.id_etatcandid like ?", i.next().id, "AAUT").fetch();
						listeCandidats.addAll(cand);
					}
					session.put("nb_demande_auto", listeCandidats.size());
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				/*
				 * Compte le nombre de validations et d'annulations en attente et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(admin) || agent.fonction.contains(gestFonct)){
					long nbValidAdmin=Candidat.count("etatCandid.id_etatcandid like ? and demandeAnnulation is not true", "AVAL");
					long nbAnnulAdmin=Candidat.count("demandeAnnulation is true");
					session.put("nb_demande_valid_admin", nbValidAdmin);
					renderArgs.put("nb_demande_valid_admin", Integer.parseInt(session.get("nb_demande_valid_admin")));
					session.put("nb_demande_annul_admin", nbAnnulAdmin);
					renderArgs.put("nb_demande_annul_admin", Integer.parseInt(session.get("nb_demande_annul_admin")));
				}
				/*
				 * Compte le nombre de validations et d'annulations en attente pour le groupement dont l'agent est responsable
				 * et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(gestTer)){
					long nbValidTerri=Candidat.count("etatCandid.id_etatcandid like ? and stage.structure.responsable like ? and demandeAnnulation is not true", "AVAL", agent);
					long nbAnnulTerri=Candidat.count("demandeAnnulation is true and stage.structure.responsable.id like ? and etatCandid.id_etatcandid not like ? or etatCandid.nom not like ?", agent.id, "ANN", "REF");
					session.put("nb_demande_valid_terri", nbValidTerri);
					renderArgs.put("nb_demande_valid_terri", Integer.parseInt(session.get("nb_demande_valid_terri")));
					session.put("nb_demande_annul_terri", nbAnnulTerri);
					renderArgs.put("nb_demande_annul_terri", Integer.parseInt(session.get("nb_demande_annul_terri")));
				}
				
				/*
				 * Création des variables de session
				 */
				
				/*
				 * groupementResp_id représente l'id du groupement de l'agent si celui-ci est le responsable
				 * Sinon l'id du groupement auquel il appartient s'il possède la fonction gestionnaireTerritorial
				 */
				Groupement gpmt=Groupement.find("responsable like ?", agent).first();
				if(gpmt!=null){
					session.put("groupementResp_id", gpmt.id);
				}
				else if(agent.fonction.contains(gestTer)){
					session.put("groupementResp_id", agent.cis.groupement.id);
				}
				
				int aujourdhui=Calendar.getInstance().get(Calendar.YEAR);
				session.put("nomUtilisateur", agent.nomUtilisateur);
				session.put("anneeEnCours", aujourdhui);
				session.put("agent_id", agent.id);
				session.put("agent_niv", agent.niv.niv);
				session.put("agent_cis", agent.cis);
				session.put("agent_grpt", agent.cis.groupement);
				session.put("chef_CIS", agent.fonction.contains(chef_CIS));
				session.put("agent_email", agent.email);
				session.put("agent_fullname", agent.fullname());
				session.put("agent_responsable", resp);
				session.put("agent_grade", agent.grade.toString());
				session.put("gestionnaireFonct", (agent.fonction.contains(gestFonct)));
				session.put("gestionnaireTerri", agent.fonction.contains(gestTer));
				session.put("formateur", agent.fonction.contains(formateur));
				session.put("admin", agent.fonction.contains(admin));
				session.put("CISService", agent.cis.nom);
				/*
				 * Compte le nombre de validations en attente pour les fmpa et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(admin) || agent.fonction.contains(gestFonct)){
					long nbValidAdmin=FMPA.count("etat.nom like ?", "Attente de validation");
					session.put("nb_valid_fmpa", nbValidAdmin);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}else if(agent.fonction.contains(gestTer)){
					long nbValidTerri=FMPA.count("etat.nom like ? and cis.groupement.nom like ?", "Attente de validation", session.get("agent_grpt"));
					session.put("nb_valid_fmpa", nbValidTerri);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}else if(agent.fonction.contains(chef_CIS) || resp){
					long nbValidCis=FMPA.count("etat.nom like ? and cis.nom like ?", "Attente de validation", session.get("CISService"));
					session.put("nb_valid_fmpa", nbValidCis);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}
				System.out.println(session.get("nb_valid_fmpa"));
				/*
				 * Création des variables de rendu
				 */
				if(session.contains("groupementResp_id")){
					renderArgs.put("groupementResp_id", Long.parseLong(session.get("groupementResp_id")));
				}
				renderArgs.put("anneeEnCours", Integer.parseInt(session.get("anneeEnCours")));
				renderArgs.put("CISService", session.get("CISService"));
				renderArgs.put("agent_niv", Integer.parseInt(session.get("agent_niv")));
				renderArgs.put("agent_grpt", session.get("agent_grpt"));
				renderArgs.put("chef_CIS", session.get("chef_CIS").equals("true"));
				renderArgs.put("admin", session.get("admin").equals("true"));
				renderArgs.put("formateur", session.get("formateur").equals("true"));
				renderArgs.put("agent_email", session.get("agent_email"));
				renderArgs.put("agent_fullname", session.get("agent_fullname"));
				renderArgs.put("agent_responsable", session.get("agent_responsable").equals("true"));
				renderArgs.put("agent_grade", session.get("agent_grade"));
				renderArgs.put("gestionnaireFonct", session.get("gestionnaireFonct").equals("true"));
				renderArgs.put("gestionnaireTerri", session.get("gestionnaireTerri").equals("true"));
				if(agent.niv.id != 0){
					session.put("agent_for", agent.niv);
					renderArgs.put("agent_for", session.get("agent_for"));
				}
				Calendar c=Calendar.getInstance();
				renderArgs.put("Annee", c.get(Calendar.YEAR));
			}
			else{
				/*
				 * Création des variables de rendu si les variables de session existent
				 */
				if(session.contains("nb_demande_valid_terri") || session.contains("nb_demande_annul_terri")){
					renderArgs.put("nb_demande_valid_terri", Integer.parseInt(session.get("nb_demande_valid_terri")));
					renderArgs.put("nb_demande_annul_terri", Integer.parseInt(session.get("nb_demande_annul_terri")));
				}
				if(session.contains("nb_demande_auto")){
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				if(session.contains("nb_demande_valid_admin") || session.contains("nb_demande_annul_admin")){
					renderArgs.put("nb_demande_valid_admin", Integer.parseInt(session.get("nb_demande_valid_admin")));
					renderArgs.put("nb_demande_annul_admin", Integer.parseInt(session.get("nb_demande_annul_admin")));
				}
				if(session.contains("nb_demande_auto")){
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				renderArgs.put("anneeEnCours", Integer.parseInt(session.get("anneeEnCours")));
				renderArgs.put("CISService", session.get("CISService"));
				renderArgs.put("agent_niv", Integer.parseInt(session.get("agent_niv")));
				renderArgs.put("agent_grpt", session.get("agent_grpt"));
				renderArgs.put("chef_CIS", session.get("chef_CIS").equals("true"));
				renderArgs.put("admin", session.get("admin").equals("true"));
				renderArgs.put("formateur", session.get("formateur").equals("true"));
				renderArgs.put("agent_email", session.get("agent_email"));
				renderArgs.put("agent_fullname", session.get("agent_fullname"));
				renderArgs.put("agent_responsable", session.get("agent_responsable").equals("true"));
				renderArgs.put("agent_grade", session.get("agent_grade"));
				renderArgs.put("gestionnaireFonct", session.get("gestionnaireFonct").equals("true"));
				renderArgs.put("gestionnaireTerri", session.get("gestionnaireTerri").equals("true"));
				renderArgs.put("agent_for", session.get("agent_for"));
				if(session.contains("nb_valid_fmpa")){
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}
				if(session.contains("groupementResp_id")){
					renderArgs.put("groupementResp_id", Long.parseLong(session.get("groupementResp_id")));
				}
				Calendar c=Calendar.getInstance();
				renderArgs.put("Annee", c.get(Calendar.YEAR));
			}
		}
	}
	
	/**
	 * Fonction appelée pour récupérer les informations nécessaires à la liste des fiches écheliers.
	 * Appelle le fichier html éponyme
	 * @return fiches: liste des fiches echelle, aujourdhui: date courante, isFiche: true si fiches n'est pas vide
	 */
	public static void listEchelle(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<FicheEchelle> fiches; 
		Date aujourdhui = new Date();
		CIS cis=CIS.find("nom like ?", session.get("CISService")).first();
		boolean isFiche=false;
		//récupération des FichesEchelles en fonction de la fonction
		if(session.get("gestionnaireFonct").equals("true") || session.get("admin").equals("true")){
			fiches=FicheEchelle.findAll();
		}
		else if(session.get("gestionnaireTerri").equals("true")){
			fiches=FicheEchelle.find(" agent.cis.groupement like ? or cis.groupement like ?", cis.groupement, cis.groupement).fetch();
		}
		else if(session.get("agent_responsable").equals("true")||session.get("chef_CIS").equals("true")){
			//pour les chefs de cis ou agents associés, récupère la liste des cis dont l'agent est responsable
			List<CIS> listCis=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
			CIS c;
			//ajoute son cis s'il n'y est pas
			if(!listCis.contains(cis)){
				listCis.add(cis);
			}
			Iterator<CIS> itCis=listCis.iterator();
			List<FicheEchelle> listFiche;
			fiches=new ArrayList<FicheEchelle>();
			//pour chaque cis récupère les fiches qui se déroulent dans le cis ou dont l'agent fait parti du cis
			while(itCis.hasNext()){
				c=itCis.next();
				listFiche=FicheEchelle.find("cis like ? or agent.cis like ?", c, c).fetch();
				FicheEchelle f;
				Iterator<FicheEchelle> itf=listFiche.iterator();
				while(itf.hasNext()){
					f=itf.next();
					if(!fiches.contains(f)){
						fiches.add(f);
					}
				}
			}
		}
		else{
			fiches=FicheEchelle.find("agent.cis.id like ? or cis.id like ?", cis.id, cis.id).fetch();
		}
		isFiche=(fiches.size()!=0);
		renderArgs.put("isFiche", isFiche);
		render(fiches, aujourdhui, isFiche);
	}
	
	/**
	 * Fonction appelée pour récupérer les informations nécessaires à la création d'une nouvelle fiche.
	 * Appelle le fichier html éponyme qui permet de créer une fiche.
	 * @return <b>centres</b>: les cis<br><b>cadres</b>: cadres d'utilisation<br><b>roles</b>: roles des écheliers<br><b>durees</b>: durées des formations<br><b>agents</b>: liste des agents du cis<br><b>idCis</b>: l'identifiant du cis de la session courante
	 */
	public static void newFicheForm(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<CIS> centres;
		List<CIS> centresbis;
		List<CadreUtilisationEchelle> cadres;
		List<RoleEchelle> roles;
		List<MoyenEchelle> moyens;
		List<Duree> durees;
		List<Agent> agents;

		//récupération des cis, des cadres d'utilisation des échelles, des rôles des fmpa écheliers,
		//des moyens échelles et des durées
		centres=CIS.find("echelle is true order by nom").fetch();
		centresbis=CIS.find("order by nom").fetch();
		cadres=CadreUtilisationEchelle.findAll();
		roles=RoleEchelle.findAll();
		moyens=MoyenEchelle.findAll();
		durees=Duree.findAll();
		CIS premier=CIS.find("nom like ?", session.get("CISService")).first();
		//si le centre de l'agent contient une échelle, l'affiche dans le select
		//sinon affiche le premier centre de la liste
		if(centres.contains(premier)){
			agents=Agent.find("cis like ?", premier).fetch();
		}else{
			premier=centres.get(0);
			agents=Agent.find("cis like ?", premier).fetch();
		}
		long idCis=premier.id;
		render(centres, cadres, roles, moyens, durees, agents, idCis, centresbis);
	}
	
	/**
	 * Crée la fiche échelle avec les informations du formulaire. Vérifie que les informations obligatoires ont été renseignées et sauvegarde la fiche.
	 * @param agent : id de l'agent
	 * @param date
	 * @param moyen : id du moyen échelle
	 * @param duree : id de la durée
	 * @param cadre : id du cadre d'utilisation
	 * @param role : id du rôle
	 */
	public static void newFicheSave(long agent, long cis, Date date, long moyen, long duree, long cadre, long role){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération des objets par les id
		Agent agentObj=Agent.findById(agent);
		Duree dureeObj=Duree.findById(duree);
		MoyenEchelle moyenObj=MoyenEchelle.findById(moyen);
		CadreUtilisationEchelle cadreObj=CadreUtilisationEchelle.findById(cadre);
		RoleEchelle roleObj=RoleEchelle.findById(role);
		CIS cisObj=CIS.findById(cis);
		
		//récupération des cis, des cadres d'utilisation des échelles, des rôles des fmpa écheliers,
		//des moyens échelles et des durées
		List<CIS> centres=CIS.find("echelle is true order by nom").fetch();
		List<CIS> centresbis=CIS.find("order by nom").fetch();
		List<CadreUtilisationEchelle> cadres=CadreUtilisationEchelle.findAll();
		List<RoleEchelle> roles=RoleEchelle.findAll();
		List<MoyenEchelle> moyens=MoyenEchelle.findAll();
		List<Duree> durees=Duree.findAll();
		List<Agent> agents;
		if(agentObj!=null){
			agents=Agent.find("cis like ?", agentObj.cis).fetch();
		}else{
			agents=Agent.find("cis like ?", cisObj).fetch();
		}
		long idCis=cis;

		//création de l'objet FicheEchelle
		FicheEchelle fiche;
		fiche=new FicheEchelle(agentObj,cisObj,moyenObj,roleObj,date,dureeObj,cadreObj);
		
		//vérifie tous les champs requis et sauvegarde en cas de vérification réussie
		//Affichage d'un bandeau en fonction du résultat
		validation.valid(fiche);
		if(validation.hasErrors()){
			flash.error("Il y a une erreur dans le formulaire.");
			render("@newFicheForm", fiche, centres, cadres, roles, moyens, durees, agents, idCis, centresbis);
		}else{
			fiche.save();
			flash.success("La Fiche a bien été enregistré.");
			newFicheForm();
		}
	}
	
	/**
	 * récupère les informations de la fiche et les listes nécessaires.
	 * Appelle le fichier html éponyme qui permet de modifier une fiche.
	 * @param id : identifiant de la fiche
	 */
	public static void modifFicheForm(long id){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
			List<CIS> centres;
			List<CIS> centresbis;
			List<CadreUtilisationEchelle> cadres;
			List<RoleEchelle> roles;
			List<MoyenEchelle> moyens;
			List<Duree> durees;
			List<Agent> agents;

			//récupération des listes
			FicheEchelle fiche=FicheEchelle.findById(id);
			centres=CIS.find("echelle is true order by nom").fetch();
			centresbis=CIS.find("order by nom").fetch();
			cadres=CadreUtilisationEchelle.findAll();
			durees=Duree.findAll();
			roles=RoleEchelle.findAll();
			moyens=MoyenEchelle.findAll();
			agents=Agent.find("cis.id like ? order by nom", fiche.agent.cis.id).fetch();
			//formatage de la date pour affichage
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			String date=sdf.format(fiche.date);
			//récupération des id
			long idCis=fiche.agent.cis.id;
			long idAgent=fiche.agent.id;
			long idCadre=fiche.cadre.id;
			long idDuree=fiche.duree.id;
			long idRoles=fiche.role.id;
			long idMoyen=fiche.moyen.id;
			render(fiche, centres, cadres, durees, date, roles, moyens, agents, idCis, idCadre, idDuree, idRoles, idMoyen, idAgent, centresbis);
	}
	
	/**
	 * récupère les informations du formulaire, les compare avec les informations de la fiche originale et sauvegarde les nouvelles informations.
	 * @param agent : id de l'agent
	 * @param date
	 * @param moyen : id du moyen échelle
	 * @param duree : id de la durée
	 * @param cadre : id du cadre d'utilisation
	 * @param role : id du rôle
	 * @param fiche : id de la fiche
	 */
	public static void modifFiche(long agent, long cis, Date date, long moyen, long duree, long cadre, long role, long fiche){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération des objets par leur identifiant
		FicheEchelle ficheObj=FicheEchelle.findById(fiche);
		Agent agentObj=Agent.findById(agent);
		MoyenEchelle moyenObj=MoyenEchelle.findById(moyen);
		CadreUtilisationEchelle cadreObj=CadreUtilisationEchelle.findById(cadre);
		Duree dureeObj=Duree.findById(duree);
		RoleEchelle roleObj=RoleEchelle.findById(role);
		//si l'une des valeurs requise est nulle, renvoie un bandeau d'erreur et revient au formulaire
		if(agentObj==null||date==null||moyenObj==null||cadreObj==null||dureeObj==null||roleObj==null){
			flash.error("Il y a une erreur dans le formulaire");
			modifFicheForm(fiche);
		}else{
			//vérifie chaque champ et le modifie si nécessaire
			if(!ficheObj.agent.id.equals(agent)){ficheObj.agent=agentObj;}
			if(!ficheObj.date.equals(date)){ficheObj.date=date;}
			if(!ficheObj.moyen.id.equals(moyen)){ficheObj.moyen=moyenObj;}
			if(!ficheObj.cadre.id.equals(cadre)){ficheObj.cadre=cadreObj;}
			if(!ficheObj.duree.id.equals(duree)){ficheObj.duree=dureeObj;}
			if(!ficheObj.role.id.equals(role)){ficheObj.role=roleObj;}
			//vérifie que les valeurs sont valides
			validation.valid(ficheObj);
			if(validation.hasErrors()){
				flash.error("Il y a des erreurs dans le formulaire.");
				modifFicheForm(fiche);
			}else{
				//sauvegarde de l'objet
				ficheObj.save();
				flash.success("Les modifications ont été enregistrées.");
				listEchelle();
			}
		}
	}
	
	/**
	 * supprime une fiche de la liste
	 * @param id identifiant de la fiche
	 */
	public static void supprimerFiche(long id){
		FicheEchelle fiche=FicheEchelle.findById(id);
		fiche._delete();
		listEchelle();
	}
	
	/**
	 * Calcule les informations nécessaires aux statistiques sur la formation écheliers.
	 * Appelle le fichier html éponyme qui permet de présenter l'information.
	 * @param cis : id du cis
	 */
	public static void resumeCIS(long cis, int annee){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération du cis et des agents du cis
		CIS centre=CIS.findById(cis);
		List<Agent> agents=Agent.find("cis like ? order by nom", centre).fetch();
		
		//création des variables
		Agent a;
		int sommeVerif;
		int sommeManoeuvre;
		int sommeIntervention;
		int total;
		int totalCis=0;
		int totalVerifCis=0;
		int totalManoeuvreCis=0;
		int totalInterventionCis=0;
		FicheEchelle f;
		List<FicheEchelle> fiches;
		Iterator<FicheEchelle> itFiche;
		Iterator<Agent> it;
		StatistiqueAgent stat;
		List<List> statsMoyen=new ArrayList<List>();
		List<StatistiqueAgent> stats;
		List<MoyenEchelle> moyens=MoyenEchelle.findAll();
		Iterator<MoyenEchelle> itMoyen=moyens.iterator();
		MoyenEchelle moyen;
		Calendar c=Calendar.getInstance();
		
		while(itMoyen.hasNext()){
			moyen=itMoyen.next();
			//création d'un itérateur pour le parcours de la liste
			it=agents.iterator();
			stats=new ArrayList<StatistiqueAgent>();
			//parcours la liste des agents pour calculer les statistiques
			while(it.hasNext()){
				a=it.next();
				//création d'un objet statistique lié à l'agent a
				stat=new StatistiqueAgent(a);
				//création d'un itérateur sur la liste des fiches de l'agent
				fiches=FicheEchelle.find("agent like ? and moyen like ?", a, moyen).fetch();
				itFiche=fiches.iterator();
				sommeVerif=0;
				sommeManoeuvre=0;
				sommeIntervention=0;
				total=0;
				//parcours de toutes les fiches de l'agent a
				//calcul de la somme du temps passé par cadre de formation
				while(itFiche.hasNext()){
					f=itFiche.next();
					c.setTime(f.date);
					if(c.get(Calendar.YEAR)==annee){
						if(f.cadre.id_cadreutilisationechelle.equals("VERIF")){
							sommeVerif=sommeVerif+f.duree.minutes;
						}
						if(f.cadre.id_cadreutilisationechelle.equals("MANOE")){
							sommeManoeuvre=sommeManoeuvre+f.duree.minutes;
						}
						if(f.cadre.id_cadreutilisationechelle.equals("INTER")){
							sommeIntervention=sommeIntervention+f.duree.minutes;
						}
					}
				}
				total=sommeVerif+sommeManoeuvre+sommeIntervention;
				if(total>0){
					//ajout des sommes calculés à l'objet statistique
					totalVerifCis=totalVerifCis+sommeVerif;
					stat.add("Verification", ""+sommeVerif/60+" h "+sommeVerif%60+" min");
					totalManoeuvreCis=totalManoeuvreCis+sommeManoeuvre;
					stat.add("Manoeuvre", ""+sommeManoeuvre/60+" h "+sommeManoeuvre%60+" min");
					totalInterventionCis=totalInterventionCis+sommeIntervention;
					stat.add("Intervention", ""+sommeIntervention/60+" h "+sommeIntervention%60+" min");
					stat.add("Somme", ""+(total)/60+" h "+(total)%60+" min");
					stat.add("Moyen", moyen.nom);
					//ajout de l'objet statistique à la liste
					stats.add(stat);
					totalCis=totalCis+total;
				}
			}
			statsMoyen.add(stats);
		}
		List<Integer> infosRepartition=new ArrayList<Integer>();
		infosRepartition.add(totalVerifCis);
		infosRepartition.add(totalManoeuvreCis);
		infosRepartition.add(totalInterventionCis);
		String totalString=""+totalCis/60+" h "+totalCis%60+" min";
		render(statsMoyen, totalString, infosRepartition);
	}
	
	/**
	 * Récupère la liste des cis en fonction des droits de la cession courante
	 * Appelle le fichier html éponyme.
	 */
	public static void statForm(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<CIS> ciss;
		CIS cis=CIS.find("nom like ?", session.get("CISService")).first();
		//récupère la liste des cis visibles de l'agent en fonction de sa fonction
		if(session.get("gestionnaireFonct").equals("true") || session.get("admin").equals("true")){
			ciss=CIS.find("order by nom").fetch();
		}
		else if(session.get("gestionnaireTerri").equals("true")){
			ciss=CIS.find("groupement like ? order by nom", cis.groupement).fetch();
		}
		else if(session.get("agent_responsable").equals("true")){
			ciss=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
			if(!ciss.contains(cis)){
				ciss.add(cis);
			}
		}
		else{
			ciss=new ArrayList<CIS>();
			ciss.add(cis);
		}
		long idCis=cis.id;
		//crée la liste des années composée de l'année courante, des deux années passées et de l'année suivante
		List<Integer> annees=new ArrayList<Integer>();
		Calendar c=Calendar.getInstance();
		int x=c.get(Calendar.YEAR);
		annees.add(x+1);
		annees.add(x);
		annees.add(x-1);
		annees.add(x-2);
		render(ciss, idCis, annees, x);
	}
}